package com.hisense.davidmoten.rtree.geometry;

import java.io.Serializable;

/**
 * A geometrical region that represents an Entry spatially. It is recommended
 * that implementations of this interface implement equals() and hashCode()
 * appropriately that entry equality checks work as expected.
 *
 * 中文：
 * 该接口表示空间索引中条目的几何区域。建议实现类正确实现 equals() 与
 * hashCode()，以确保条目在集合操作和相等性比较中的行为符合预期。
 */
public interface Geometry extends Serializable{

    /**
     * <p>
     * Returns the distance to the given {@link Rectangle}. For a {@link Rectangle}
     * this might be Euclidean distance but for an EPSG4326 lat-long Rectangle might
     * be great-circle distance. The distance function should satisfy the following
     * properties:
     * </p>
     * 
     * <p>
     * <code>distance(r) &gt;= 0</code>
     * </p>
     * 
     * <p>
     * <code>if r1 contains r2 then distance(r1)&lt;=distance(r2)</code>
     * </p>
     * 
     * 中文：
     * 返回当前几何到指定 {@link Rectangle} 的距离。对于常规平面坐标，此距离通常为
     * 欧氏距离；对于地理坐标（EPSG:4326，经纬度），该距离通常采用大圆距离（球面距离）。
     * 距离函数需满足：
     * - 非负性：distance(r) ≥ 0；
     * - 单调性：若 r1 包含 r2，则 distance(r1) ≤ distance(r2)。
     * 
     * @param r 矩形，用于计算到其的距离
     * @return 当前几何到矩形 r 的距离
     */
    double distance(Rectangle r);

    /**
     * Returns the minimum bounding rectangle of this geometry.
     * 
     * 中文：
     * 返回该几何的最小外接矩形（MBR，Minimum Bounding Rectangle）。
     * 
     * @return minimum bounding rectangle
     */
    Rectangle mbr();

    /**
     * 中文：
     * 判断该几何是否与给定的矩形相交（包含边界接触视为相交）。
     * 
     * @param r 目标矩形
     * @return 是否相交
     */
    boolean intersects(Rectangle r);

    /**
     * 中文：
     * 指示该几何是否使用双精度（double）实现。
     * 若返回 true，表示使用 double 精度；false 表示使用 float 精度。
     * 该信息可用于选择合适的数值算法或索引策略。
     * 
     * @return 是否为双精度实现
     */
    boolean isDoublePrecision();
}
